package pharao.client.views.game.landkarte;

import hmvc4gwt.client.event.IHmvcEvent;
import hmvc4gwt.framework.client.events.RemoveViewEvent;
import hmvc4gwt.framework.client.view.GuiView;

import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

import pharao.client.dto.LandkarteDTO;
import pharao.client.dto.OrtDTO;
import pharao.client.i18ln.GuiText;
import pharao.client.views.events.GetModelDataEvent;
import pharao.client.views.events.SetModelDataEvent;
import pharao.client.views.game.landkarte.events.RefreshLandkarteEvent;
import pharao.client.views.game.landkarte.ort.basics.OrtBasicsController;
import pharao.client.views.game.landkarte.ort.basics.OrtBasicsModel;
import pharao.client.views.game.landkarte.ort.basics.OrtBasicsView;
import pharao.client.views.game.landkarte.ort.basics.events.ShowOrtBasicViewEvent;
import pharao.client.views.game.menu.GameMenuModel;
import pharao.client.views.game.story.StoryView;

public class LandkarteView extends GuiView {

	private Hyperlink hyperlinkGameMenu = GameMenuModel.getHyperlinkMenu();

	private Hyperlink hyperlinkOrt2d = new Hyperlink(GuiText.constants
			.link_game_map_2d(), null);

	private Hyperlink hyperlinkOrt3d = new Hyperlink(GuiText.constants
			.link_game_map_3d(), null);

	private Hyperlink hyperlinkOrtBasics = new Hyperlink(GuiText.constants
			.link_game_map_basics(), null);

	private Hyperlink hyperlinkOrtBauMeister = StoryView.getHyperlinkStory();

	/**
	 * enthält die Status-Daten der Landkarte
	 */
	private LandkarteDTO landkarteDTO;

	public void initImpl() {

		VerticalPanel mapPanel = new VerticalPanel();
		mapPanel.setStylePrimaryName("mapPanel");

		Label labelTitle = new Label(GuiText.constants.text_game_map_title());
		labelTitle.setStylePrimaryName("header1");

		Label labelBeschreibung = new Label(GuiText.constants
				.text_game_map_beschreibung());
		labelBeschreibung.setStylePrimaryName("text");

		/*
		 * Model-Daten holen
		 */
		getController().register(SetModelDataEvent.class, this);
		getController().register(RefreshLandkarteEvent.class, this);

		/*
		 * ClickListener erstellen
		 */
		ClickListener listener = new ClickListener() {
			public void onClick(Widget sender) {
				showOrt(sender);
			}
		};

		/*
		 * listener setzen
		 */
		hyperlinkOrtBauMeister.addClickListener(listener);
		hyperlinkOrtBasics.addClickListener(listener);
		hyperlinkOrt2d.addClickListener(listener);
		hyperlinkOrt3d.addClickListener(listener);

		/*
		 * style stetzen
		 */
		hyperlinkOrtBauMeister.setStylePrimaryName("linkMapBaumeister");
		hyperlinkOrtBasics.setStylePrimaryName("linkMapBasics");
		hyperlinkOrt2d.setStylePrimaryName("linkMap2d");
		hyperlinkOrt3d.setStylePrimaryName("linkMap3d");
		// hyperlinkGameMenu.setStylePrimaryName("");

		/*
		 * Links zur Karte hinzufügen
		 */
		mapPanel.add(hyperlinkOrtBauMeister);
		mapPanel.add(hyperlinkOrtBasics);
		mapPanel.add(hyperlinkOrt2d);
		mapPanel.add(hyperlinkOrt3d);
		// mapPanel.add(hyperlinkGameMenu);

		/*
		 * alles zum mainPanel hinzufügen
		 */
		add(labelTitle);
		add(labelBeschreibung);
		add(hyperlinkGameMenu);
		add(mapPanel);

	}

	public void handleEventImpl(IHmvcEvent event) {

		if (event instanceof SetModelDataEvent) {

			if (event.getPayload() instanceof LandkarteDTO) {
				initView((LandkarteDTO) event.getPayload());
			}
		} else if (event instanceof RefreshLandkarteEvent) {
			getController().fireEventLocal(new GetModelDataEvent());
		}

	}

	private void initView(LandkarteDTO landkarte) {
		setLandkarteDTO(landkarte);

	}

	private void setLandkarteDTO(LandkarteDTO landkarteDTO) {
		this.landkarteDTO = landkarteDTO;
	}

	/**
	 * zeigt den angeklickten Ort an
	 */
	private void showOrt(Widget sender) {

		if (sender == hyperlinkOrtBasics) {

			getController().addChildComponent(new OrtBasicsController(),
					new OrtBasicsModel(landkarteDTO.getOrt(OrtDTO.ID_ORT_1)),
					new OrtBasicsView());

			getController().fireEvent(new RemoveViewEvent(this), true, false,
					false);

			getController().fireEvent(new ShowOrtBasicViewEvent(), false,
					false, true);

		} else if (sender == hyperlinkOrt2d) {

			// getController().addChildComponent(new Ort2dController(), new
			// Ort2dModel(landkarteDTO.getOrt(OrtDTO.ID_ORT_2)), new
			// Ort2dView());
			// getController().fireEvent(new RemoveViewEvent(this), true, false,
			// false);

		} else if (sender == hyperlinkOrt3d) {

			// getController().addChildComponent(new Ort3dController(), new
			// Ort3dModel(landkarteDTO.getOrt(OrtDTO.ID_ORT_3)), new
			// Ort3dView());
			// getController().fireEvent(new RemoveViewEvent(this), true, false,
			// false);

		}

	}

	public void terminate() {
		// TODO Auto-generated method stub

	}

}
